<!DOCTYPE html>


<html lang="en">
  

    <head>
      <meta charset="utf-8" />
        
      <meta name="description" content="一个简单的博客" />
      
      <meta
        name="viewport"
        content="width=device-width, initial-scale=1, maximum-scale=1"
      />
      <title> 阿川的Blog</title>
  <meta name="generator" content="hexo-theme-ayer">
      
      <link rel="shortcut icon" href="/favicon.ico" />
       
<link rel="stylesheet" href="/dist/main.css">

      
<link rel="stylesheet" href="/css/fonts/remixicon.css">

      
<link rel="stylesheet" href="/css/custom.css">
 
      <script src="https://cdn.staticfile.org/pace/1.2.4/pace.min.js"></script>
       
 

      <link
        rel="stylesheet"
        href="https://cdn.jsdelivr.net/npm/@sweetalert2/theme-bulma@5.0.1/bulma.min.css"
      />
      <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>

      <!-- mermaid -->
      
      <style>
        .swal2-styled.swal2-confirm {
          font-size: 1.6rem;
        }
      </style>
    </head>
  </html>
</html>


<body>
  <div id="app">
    
      <canvas class="fireworks"></canvas>
      <style>
        .fireworks {
          position: fixed;
          left: 0;
          top: 0;
          z-index: 99999;
          pointer-events: none;
        }
      </style>
      
      
    <main class="content on">
      
<section class="cover">
    
      
      <a class="forkMe" href="https://github.com/Shen-Yu/hexo-theme-ayer"
        target="_blank"><img width="149" height="149" src="/images/forkme.png"
          class="attachment-full size-full" alt="Fork me on GitHub" data-recalc-dims="1"></a>
    
  <div class="cover-frame">
    <div class="bg-box">
      <img src="/images/222.jpg" alt="image frame" />
    </div>
    <div class="cover-inner text-center text-white">
      <h1><a href="/">阿川的Blog</a></h1>
      <div id="subtitle-box">
        
        <span id="subtitle"></span>
        
      </div>
      <div>
        
      </div>
    </div>
  </div>
  <div class="cover-learn-more">
    <a href="javascript:void(0)" class="anchor"><i class="ri-arrow-down-line"></i></a>
  </div>
</section>



<script src="https://cdn.staticfile.org/typed.js/2.0.12/typed.min.js"></script>


<!-- Subtitle -->

  <script>
    try {
      var typed = new Typed("#subtitle", {
        strings: ['头发越少，实力越强', '', ''],
        startDelay: 0,
        typeSpeed: 200,
        loop: true,
        backSpeed: 100,
        showCursor: true
      });
    } catch (err) {
      console.log(err)
    }
  </script>
  
<div id="main">
  <section class="outer">
  
  
  

<div class="notice" style="margin-top:50px">
    <i class="ri-heart-fill"></i>
    <div class="notice-content" id="broad"></div>
</div>
<script type="text/javascript">
    fetch('https://v1.hitokoto.cn')
        .then(response => response.json())
        .then(data => {
            document.getElementById("broad").innerHTML = data.hitokoto;
        })
        .catch(console.error)
</script>

<style>
    .notice {
        padding: 20px;
        border: 1px dashed #e6e6e6;
        color: #969696;
        position: relative;
        display: inline-block;
        width: 100%;
        background: #fbfbfb50;
        border-radius: 10px;
    }

    .notice i {
        float: left;
        color: #999;
        font-size: 16px;
        padding-right: 10px;
        vertical-align: middle;
        margin-top: -2px;
    }

    .notice-content {
        display: initial;
        vertical-align: middle;
    }
</style>
  
  <article class="articles">
    
    
    
    
    <article
  id="post-课堂画图建模作业"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/22/%E8%AF%BE%E5%A0%82%E7%94%BB%E5%9B%BE%E5%BB%BA%E6%A8%A1%E4%BD%9C%E4%B8%9A/"
    >课堂画图建模作业</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/22/%E8%AF%BE%E5%A0%82%E7%94%BB%E5%9B%BE%E5%BB%BA%E6%A8%A1%E4%BD%9C%E4%B8%9A/" class="article-date">
  <time datetime="2023-03-22T12:01:30.000Z" itemprop="datePublished">2023-03-22</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p><img src="/images/1.png"></p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-了解WBS"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/20/%E4%BA%86%E8%A7%A3WBS/"
    >了解WBS</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/20/%E4%BA%86%E8%A7%A3WBS/" class="article-date">
  <time datetime="2023-03-20T09:15:07.000Z" itemprop="datePublished">2023-03-20</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>一、WBS的定义<br>   WBS由Work（工作）、Breakdown（分解）、Structure（结构)组成，Work指的是某种输出、工作成果，或可以交付性成果；<br>Breakdown指的是将工作划分成不同部分或类别，分离成为更简单且可识别的事物；Structure指的是用确定的组织方式来安排事物。<br>对于以上定义我们可以将WBS理解成为将一个大的可支付性的工作成果按照一定的组织安排方式来逐级分解成多级多个的可交付性成果。<br>二、WBS的特点<br>  1.支持对实现输出、目标、可交付性成果所需的所有工作的定义。<br>  2.用来说明并定义可交付性成果的层级结构，此层级结构是以“父子”关系的形式建立起来的。<br> 3.WBS有一个客观或具体的结果，这个结果被称为可交付性成果、输出或结果。WBS代表了对项目可交付成果和范围的清晰描述，也就是这个项目是什么。<br> WBS描述的不是如何或何时产出可交付性成果，而是对项目输出、项目范围、产品范围或者可交付成果的描述和细化。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-什么是分而治之？"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/20/%E4%BB%80%E4%B9%88%E6%98%AF%E5%88%86%E8%80%8C%E6%B2%BB%E4%B9%8B%EF%BC%9F/"
    >什么是分而治之？</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/20/%E4%BB%80%E4%B9%88%E6%98%AF%E5%88%86%E8%80%8C%E6%B2%BB%E4%B9%8B%EF%BC%9F/" class="article-date">
  <time datetime="2023-03-20T09:03:36.000Z" itemprop="datePublished">2023-03-20</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>分而治之其实就是一种解决问题的方法，说得简单点就是把一个问题拆分为若干个小问题，然后分别解决。<br>在软件工程中，分治算法和分而治之解决问题的思路一样，就是将一个大型的开发项目分成很多小块，将所分好的小块交给相应的人进行开发管理。<br>每个小问题解决完后，再整合在一块，就可以得到这个大型的开发项目。<br>分治算法一般包括三个过程，：分解，将原问题分解成如干个子问题；解决，递归求解各自子问题，如果子问题足够小，直接求解。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-为什么软件开发周期总是预估的2-3倍"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/20/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%91%A8%E6%9C%9F%E6%80%BB%E6%98%AF%E9%A2%84%E4%BC%B0%E7%9A%842-3%E5%80%8D/"
    >为什么软件开发周期总是预估的2~3倍</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/20/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%91%A8%E6%9C%9F%E6%80%BB%E6%98%AF%E9%A2%84%E4%BC%B0%E7%9A%842-3%E5%80%8D/" class="article-date">
  <time datetime="2023-03-20T08:36:31.000Z" itemprop="datePublished">2023-03-20</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>   在文章中，作者从旧金山出发，沿着西海岸徒步旅行，到洛杉矶的纽波特沙滩学好友见面，预计十天后的晚上六点到达。<br>然而，由于地图的不规则，比预期多了100英里，而后又因为路况、天气等原因，预计到达的时间又往后推迟了数天。<br>预期只需要十天左右时间，却因为错误的估算和突发情况，往后拖延了很久。<br>     结合到软件开发过程中就是开发人员经验不足，项目管理次数少，对软件开发过程中的各种细节，时间分配等认识不够。<br>再就是开发人员的时间估算过于乐观，只考虑了编码的时间，忽略了每个程序员的编码效率。在开发过程中，我们应该留有时间<br>来应对一些开发中出现的突发事件。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-理解结对编程"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E7%90%86%E8%A7%A3%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B/"
    >理解结对编程</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E7%90%86%E8%A7%A3%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B/" class="article-date">
  <time datetime="2023-03-14T04:10:43.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>顾名思义，结对编程就是两个程序员坐在一起，用一台开发机进行结对开发。<br>结对编程有两种类型：<br>1.分工明确型：<br>一个人负责编写代码，另外一个人审查代码，负责代码的正确性和可读性；<br>一个人负责详细设计，一个人负责代码实现；<br>一个人写功能代码，一个人写测试用例。<br>2.共同合作型：<br>两个人共同讨论关于所开发功能的架构设计、编码实现、测试方法等，然后轮流做输入和观察的工作。此模式很好地做到了信息共享，得到互补的效果。<br>结对编程提高工作效率的具体方式有很多种，比如打破知识壁垒，互相学习编程技巧，并降低产品需求设计缺陷；<br>互相配合，增强代码和产品交付质量，有效减少 BUG，从而减少测试人员工作量；<br>互相督促，减少“摸鱼”时间，有效提高工作时间；<br>互为 Backup，在能保证项目顺利进行的同时，可更好地处理人员流动。<br>结对编程的价值，从项目角度来讲，提高了产品质量；从团队角度来讲，更好的促进了团队协作氛围以及知识传递分享；从个人角度来讲，提高了个人能力和工作效率；</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-什么是3355？"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E4%BB%80%E4%B9%88%E6%98%AF3355%EF%BC%9F/"
    >什么是3355？</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E4%BB%80%E4%B9%88%E6%98%AF3355%EF%BC%9F/" class="article-date">
  <time datetime="2023-03-14T03:16:48.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>Scrum中的3-3-5-5概括了Scrum中的：3中角色、3个工件、5个事件和5种价值观。<br>我:<br>3个角色（Roles）</p>
<p>产品负责人（Product Owner）<br>Scrum Master<br>Scrum 团队<br>3个工件（Artifacts）</p>
<p>Product Backlog<br>Sprint Backlog<br>Increment<br>5个事件（Events）</p>
<p>Sprint计划会议（Sprint Planning）<br>每日Scrum会议（Daily Scrum）<br>Sprint评审会议（Sprint Review）<br>Sprint回顾会议（Sprint Retrospective）<br>Sprint迭代（Sprint Iteration）<br>5种价值观（Values）</p>
<p>Courage<br>Openness<br>Focus<br>Commitment<br>Respect</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-读书笔记-什么是DevOps"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E4%BB%80%E4%B9%88%E6%98%AFDevOps/"
    >读书笔记-什么是DevOps</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E4%BB%80%E4%B9%88%E6%98%AFDevOps/" class="article-date">
  <time datetime="2023-03-14T03:14:35.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>1.DevOps是一种重视“软件开发人员（Dev）”和“IT运维技术人员（Ops）”之间沟通合作的文化、运动或惯例。<br>透过自动化“软件交付”和“架构变更”的流程，来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。<br>2.随着业务量的增大，单机变多机，单人变多人，业务量变大，服务器的量也随着增大，开发分工专注于自己的事情，不会那么用心的进行维护，<br>再加上运维学习成本的提高，就需要专门的运维介入，但是这个时候也不是 DEVOPS，而是 DEV+OPS，<br>这时 Ops 的主要职责就是：硬件维护、网络设备维护、DBA 、基础服务维护、数据监控等，运维们擅长写各种部署，监控脚本，减少机械的重复工作，<br>开发模式变成了敏捷开发模式。<br>3.一是公司发展到BAT这种体量，会招很多人，需要技术协调栈，二是项目到后期往往会变得很大，若全都兑在一个项目里，很容易牵一发而动全身。<br>所以，拆分解耦是最终的出路，将项目拆成一个个小的服务单独部署，拆分部署催生出DEVOPS。<br>4.运维需要做的事情，慢慢的都沉淀到了各个平台上面，只要条件配置好了，开发也可以做运维的部分工作，毕竟开发才是最了解代码的人，<br>哪里出了问题看看监控日志，可以最快速度定位到问题，于是DEVOPS开发模式诞生了，开发也是运维。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-软件工程方法论对我们经软件开发有多大用处"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%96%B9%E6%B3%95%E8%AE%BA%E5%AF%B9%E6%88%91%E4%BB%AC%E7%BB%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%9C%89%E5%A4%9A%E5%A4%A7%E7%94%A8%E5%A4%84/"
    >软件工程方法论对我们经软件开发有多大用处</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E6%96%B9%E6%B3%95%E8%AE%BA%E5%AF%B9%E6%88%91%E4%BB%AC%E7%BB%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%9C%89%E5%A4%9A%E5%A4%A7%E7%94%A8%E5%A4%84/" class="article-date">
  <time datetime="2023-03-14T03:13:06.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>我认为软件工程方法论非常重要，对软件开发过程非常有帮助。软件工程方法论指的是，在软件开发的过程中，必须遵循的普遍行为和规则。<br>软件工程方法论是一个系统性的整体结构的理论框架，为一款良好的软件建立起了基础和全面的研发过程。<br>它对于我们学习软件开发有着独特的作用，特别是对初学者而言，在软件工程方法论的基础上，我们有了一个大概的学习方向和开发框架，初学者不至于觉得茫然，无从下手。<br>它既是一个让人入手很快的框架，也是一个让后来者学习前人经验的一个方法，一个工具，让后来者可以在此基础上总结经验，扩展思维，添加自己的想法来使它更完善。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-读书笔记-有人负责，才有力量：写给在集市中迷失的一代"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E6%9C%89%E4%BA%BA%E8%B4%9F%E8%B4%A3%EF%BC%8C%E6%89%8D%E6%9C%89%E5%8A%9B%E9%87%8F%EF%BC%9A%E5%86%99%E7%BB%99%E5%9C%A8%E9%9B%86%E5%B8%82%E4%B8%AD%E8%BF%B7%E5%A4%B1%E7%9A%84%E4%B8%80%E4%BB%A3/"
    >读书笔记-有人负责，才有力量：写给在集市中迷失的一代</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E6%9C%89%E4%BA%BA%E8%B4%9F%E8%B4%A3%EF%BC%8C%E6%89%8D%E6%9C%89%E5%8A%9B%E9%87%8F%EF%BC%9A%E5%86%99%E7%BB%99%E5%9C%A8%E9%9B%86%E5%B8%82%E4%B8%AD%E8%BF%B7%E5%A4%B1%E7%9A%84%E4%B8%80%E4%BB%A3/" class="article-date">
  <time datetime="2023-03-14T03:09:55.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>1.学习计算机编程，软件开发，变得越来越容易，就像用钉子将两块木板钉在一起。<br>然而需要进一步做成椅子或者碗橱就不是那么容易，即如果我们想设计开发一个优秀完美的软件，随大流是不能够，<br>需要我们有良好的编程基本功，需要天分，需要实践，付出精力。<br>2.我们要走出无门槛的“集市”，向往“大教堂”，只有我们认真付出精力设计出的软件，才是有质量的软件，才是有生命力的代码。<br>简而言之，在信息化时代，互联网的时代，我们要学习到真正的知识，毕竟打铁还需自身硬。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
    <article
  id="post-读书笔记-从瀑布到敏捷-漫画解读软件开发模式变迁史"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E4%BB%8E%E7%80%91%E5%B8%83%E5%88%B0%E6%95%8F%E6%8D%B7-%E6%BC%AB%E7%94%BB%E8%A7%A3%E8%AF%BB%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F%E5%8F%98%E8%BF%81%E5%8F%B2/"
    >读书笔记-从瀑布到敏捷-----漫画解读软件开发模式变迁史</a> 
</h2>
 

      
    </header>
     
    <div class="article-meta">
      <a href="/2023/03/14/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-%E4%BB%8E%E7%80%91%E5%B8%83%E5%88%B0%E6%95%8F%E6%8D%B7-%E6%BC%AB%E7%94%BB%E8%A7%A3%E8%AF%BB%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F%E5%8F%98%E8%BF%81%E5%8F%B2/" class="article-date">
  <time datetime="2023-03-14T03:07:29.000Z" itemprop="datePublished">2023-03-14</time>
</a>    
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>1.先进的生产和管理理念是一个行业从小作坊走向规模化的必经之路，软件工业虽然诞生较晚，但是发展却非常迅速，这也同样得益于软件工业开发和管理理念的发展。<br>这其中就从汽车工业吸收了很多成熟的理念。<br>2.瀑布模式和敏捷开发模式是软件工业先后经历的两个阶段，而 KANBAN，SCRUM 和 LEAN 则是敏捷运动的产物。<br>3.客户被排除在生产系统之外（围墙是密闭不透明的），不能参与到软件开发的整个流程，它们只能从需求的接口人那里向系统输入需求（Client places order）。<br>正因如此，客户无法理解生产所需的费用以及为什么交付总是会延期。<br>4.瀑布模型最大的弊端，下游工作的开展严格依赖于上游交付件的完成情况，这无疑是一种浪费。<br>5.在敏捷开发中，客户会参与到软件开发的整个流程中，不过越来越多的问题也暴露出来，越来越多不着调的需求也会被提出，其显著特点就是能够及时响应客户需求的变更，<br>不断适应新的趋势。<br>6.在敏捷开发中，生产不再是线性的，开发的同时还会进行测试工作，所有人都在同时工作。<br>7.就这篇漫画看来SCRUM+KANBAN是两个避免混乱的好方法。<br>8.精益软件开发，优先建立一个最简可用的原型产品投放市场或交付到客户手中，尽早交付产品给客户或部署到生产环境，也促进了 DevOps，持续集成（CI），<br>生产环境测试（testing in production）等实践的发展。尽早交付产品，尽早从用户获取反馈，不论是好的还是坏的，促使问题尽早暴露，尽早修复，持续集成，持续改进。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
    </footer>
  </div>

   
   
  
</article>

    
  </article>
  

  
  <nav class="page-nav">
    
    <a class="extend prev" rel="prev" href="/">上一页</a><a class="page-number" href="/">1</a><span class="page-number current">2</span><a class="page-number" href="/page/3/">3</a><a class="extend next" rel="next" href="/page/3/">下一页</a>
  </nav>
  
</section>
</div>

      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2015-2023
        <i class="ri-heart-fill heart_icon"></i> John Doe
      </li>
    </ul>
    <ul>
      <li>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>Visitors:<span id="busuanzi_value_site_uv"></span></span>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>Views:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
        <script type="text/javascript" src='https://s9.cnzz.com/z_stat.php?id=1278069914&amp;web_id=1278069914'></script>
        
      </li>
    </ul>
  </div>
</footer>    
    </main>
    <div class="float_btns">
      <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

    </div>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/ayer-side.svg" alt="阿川的Blog"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags/%E6%97%85%E8%A1%8C/">旅行</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" target="_blank" rel="noopener" href="http://shenyu-vip.lofter.com">摄影</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/friends">友链</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/2019/about">关于我</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      <a class="nav-item-link nav-item-search"  title="Search">
        <i class="ri-search-line"></i>
      </a>
      
      
      <a class="nav-item-link" target="_blank" href="/atom.xml" title="RSS Feed">
        <i class="ri-rss-line"></i>
      </a>
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    <div class="reward-item">
      <img class="reward-img" src="/images/alipay.jpg">
      <span class="reward-type">支付宝</span>
    </div>
    
    
    <div class="reward-item">
      <img class="reward-img" src="/images/wechat.jpg">
      <span class="reward-type">微信</span>
    </div>
    
  </div>
</div>
    
<script src="/js/jquery-3.6.0.min.js"></script>
 
<script src="/js/lazyload.min.js"></script>

<!-- Tocbot -->

<script src="https://cdn.staticfile.org/jquery-modal/0.9.2/jquery.modal.min.js"></script>
<link
  rel="stylesheet"
  href="https://cdn.staticfile.org/jquery-modal/0.9.2/jquery.modal.min.css"
/>
<script src="https://cdn.staticfile.org/justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js"></script>

<script src="/dist/main.js"></script>

<!-- ImageViewer -->
 <!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/photoswipe/4.1.3/default-skin/default-skin.min.css">
<script src="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe.min.js"></script>
<script src="https://cdn.staticfile.org/photoswipe/4.1.3/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script> 
<!-- MathJax -->

<!-- Katex -->

<!-- busuanzi  -->
 
<script src="/js/busuanzi-2.3.pure.min.js"></script>
 
<!-- ClickLove -->

<!-- ClickBoom1 -->

<script src="https://cdn.staticfile.org/animejs/3.2.1/anime.min.js"></script>

<script src="/js/clickBoom1.js"></script>
 
<!-- ClickBoom2 -->

<!-- CodeCopy -->
 
<link rel="stylesheet" href="/css/clipboard.css">
 <script src="https://cdn.staticfile.org/clipboard.js/2.0.10/clipboard.min.js"></script>
<script>
  function wait(callback, seconds) {
    var timelag = null;
    timelag = window.setTimeout(callback, seconds);
  }
  !function (e, t, a) {
    var initCopyCode = function(){
      var copyHtml = '';
      copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
      copyHtml += '<i class="ri-file-copy-2-line"></i><span>COPY</span>';
      copyHtml += '</button>';
      $(".highlight .code pre").before(copyHtml);
      $(".article pre code").before(copyHtml);
      var clipboard = new ClipboardJS('.btn-copy', {
        target: function(trigger) {
          return trigger.nextElementSibling;
        }
      });
      clipboard.on('success', function(e) {
        let $btn = $(e.trigger);
        $btn.addClass('copied');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-checkbox-circle-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPIED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-checkbox-circle-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
      clipboard.on('error', function(e) {
        e.clearSelection();
        let $btn = $(e.trigger);
        $btn.addClass('copy-failed');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-time-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPY FAILED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-time-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
    }
    initCopyCode();
  }(window, document);
</script>
 
<!-- CanvasBackground -->

<script>
  if (window.mermaid) {
    mermaid.initialize({ theme: "forest" });
  }
</script>


    
    

  </div>
</body>

</html>